package cn.edu.hnu.matching.service;

import cn.edu.hnu.matching.common.PageResult;
import cn.edu.hnu.matching.common.Result;
import cn.edu.hnu.matching.model.dto.UserModifyAvatarDto;
import cn.edu.hnu.matching.model.dto.UserSearchByKeywordDto;
import cn.edu.hnu.matching.model.entity.User;
import cn.edu.hnu.matching.model.vo.UserDetailVo;
import cn.edu.hnu.matching.model.vo.UserSearchVo;
import cn.edu.hnu.matching.model.vo.UserWxLoginVo;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
 * <p>
 * 用户表 服务类
 * </p>
 *
 * @author n70huihui
 * @since 2025-04-10
 */
public interface IUserService extends IService<User> {

    /**
     * 登录
     * @param code 微信登录凭证码
     * @return 用户信息
     */
    Result<UserWxLoginVo> wxlogin(String code);

    /**
     * 用户退出登录
     * @param openId 用户唯一标识
     * @return
     */
    Result<Void> logout(String openId);

    /**
     * 修改个人头像
     * @param userModifyAvatarDto 用户修改头像数据封装
     * @return
     */
    Result<Void> modifyAvatar(UserModifyAvatarDto userModifyAvatarDto);

    /**
     * 修改用户名
     * @param userName 新用户名
     * @return
     */
    Result<Void> modifyUserName(String userName);

    /**
     * 修改用户性别
     * @param gender 性别
     * @return
     */
    Result<Void> modifyGender(Short gender);

    /**
     * 修改用户个人简介
     * @param description 个人简介
     * @return
     */
    Result<Void> modifyDescription(String description);

    /**
     * 修改用户微信号
     * @param weChatId 微信号
     * @return
     */
    Result<Void> modifyWeChatId(String weChatId);

    /**
     * 修改用户QQ号
     * @param qqId QQ号
     * @return
     */
    Result<Void> modifyQQId(String qqId);

    /**
     * 修改用户标签
     * @param tags 标签
     * @return
     */
    Result<Void> modifyTags(List<String> tags);

    /**
     * 获取用户首页推荐
     * @param tags 当前用户标签
     * @return
     */
    Result<List<UserSearchVo>> getHomepageRecommendation(List<String> tags);

    /**
     * 根据id查询用户详细信息
     * @param id 用户 id
     * @return
     */
    Result<UserDetailVo> getUserDetailById(Long id);

    /**
     * 根据用户传入的关键词进行搜索
     * @param userSearchByKeywordDto 用户搜索分页数据封装
     * @return 用户分页信息列表
     */
    Result<PageResult<UserSearchVo>> searchUserByKeyword(UserSearchByKeywordDto userSearchByKeywordDto);
}
